<?php
/**
 * app controller
 * @package kernel_lib_app
 */
load_lib('/sys/controller');
/**
 * app controller
 * @author pandajingjing
 * @package kernel_lib_app
 */
abstract class app_controller extends sys_controller{

	/**
	 * 视图状态数据
	 * @var array
	 */
	protected $_arrViewState=array();

	/**
	 * 构造函数
	 */
	function __construct(){
		parent::__construct();
		$this->_arrPrivate['PAGEDATA']=array();
		$this->_arrPrivate['HEADER']=array();
	}

	/**
	 * 在控制器开始时执行（调度使用）
	 */
	function beforeRequest(){
		parent::beforeRequest();
		//do something
		$this->setData('strWebCharset',get_config('charset'));
		$arrPost=$this->getParams('post');
		if(isset($arrPost['hidViewState']) and isset($arrPost['hidFormID'])){
			$this->_arrViewState[$arrPost['hidFormID']]=json_decode(base64_decode($arrPost['hidViewState']),true);
		}
	}

	/**
	 * 在控制器结束时执行（调度使用）
	 */
	function afterRequest(){
		$arrPost=$this->getParams('post');
		if(isset($arrPost['hidViewState']) and isset($arrPost['hidFormID'])){
			$strFormID=$arrPost['hidFormID'];
			unset($arrPost['hidViewState']);
			unset($arrPost['hidFormID']);
			foreach($arrPost as $strField=>$strValue){
				$this->_arrViewState[$strFormID][$strField]=$strValue;
			}
		}
		foreach($this->_arrViewState as $strFormID=>$arrForm){
			$this->_arrViewState[$strFormID]['hidViewState']=base64_encode(json_encode($arrForm));
		}
		$this->setData('arrViewState',$this->_arrViewState);
		$this->_arrPrivate['VARI']->sendCookie();
		//发送头部信息
		foreach($this->_arrPrivate['HEADER'] as $arrHeader){
			header($arrHeader[0],$arrHeader[1],$arrHeader[2]);
		}
		parent::afterRequest();
	}

	/**
	 * 设置视图数据
	 * @param string $p_strFormID
	 * @param string $p_strField
	 * @param string $p_mixFieldValue
	 */
	function setViewState($p_strFormID,$p_strField,$p_mixFieldValue){
		$this->_arrViewState[$p_strFormID][$p_strField]=$p_mixFieldValue;
	}

	/**
	 * 获取视图数据
	 * @param string $p_strFormID
	 * @param string $p_strField
	 * @return mix
	 */
	function getViewState($p_strFormID,$p_strField){
		return $this->_arrViewState[$p_strFormID][$p_strField];
	}

	/**
	 * 获取访问该控制器的路径
	 * @param string $p_strPre
	 * @param string $p_strAction
	 * @param array $p_arrParam
	 * @param boolean $p_bolSecure
	 * @return string
	 */
	protected static function getURL($p_strPre='',$p_strAction='default',$p_arrParam=array(),$p_bolSecure=false){
		return ($p_bolSecure?'https://':'http://').get_config('fulldomain').$p_strPre.param_to_url($p_strAction,$p_arrParam);
	}
	
	/**
	 * 合并URL参数
	 * @param string $p_strURL
	 * @param array $p_arrParam
	 * @return string
	 */
	protected static function mergeURL($p_strURL,$p_arrParam){
		return merge_url($p_strURL,$p_arrParam);
	}

	/**
	 * 添加头部信息 
	 * @param string $p_strValue
	 * @param boolean $p_bolReplace
	 * @param int $p_intCode
	 */
	protected function addHeader($p_strValue,$p_bolReplace=true,$p_intCode=NULL){
		$this->_arrPrivate['HEADER'][]=array( 
				$p_strValue,
				$p_bolReplace,
				$p_intCode 
		);
	}

	/**
	 * 写Cookie
	 * @param string $p_strName
	 * @param string $p_strValue
	 * @param int $p_intExpire
	 * @param string $p_strPath
	 */
	protected function setCookie($p_strName,$p_strValue,$p_intExpire,$p_strPath='/'){
		$this->_arrPrivate['VARI']->setCookie($p_strName,$p_strValue,$p_intExpire,$p_strPath);
	}

	/**
	 * 服务器页面跳转
	 * @param string $p_strURL
	 * @param boolean $p_bolIsTemp
	 */
	protected function redirectURL($p_strURL,$p_bolIsTemp=true){
		$this->addHeader('Location:'.$p_strURL,true,$p_bolIsTemp?302:301);
		$this->afterRequest();
		exit();
	}

	/**
	 * 设置Page数据
	 * @param string $p_strKey
	 * @param mix $p_mixValue
	 */
	protected function setData($p_strKey,$p_mixValue){
		$this->_arrPrivate['PAGEDATA'][$p_strKey]=$p_mixValue;
	}

	/**
	 * 获取参数
	 * @param string $p_strKey
	 * @return mix
	 */
	protected function getData($p_strKey){
		return isset($this->_arrPrivate['PAGEDATA'][$p_strKey])?$this->_arrPrivate['PAGEDATA'][$p_strKey]:NULL;
	}
	
	/**
	 * 得到客户端IP
	 * return string
	 */
	protected function getClientIP(){
		return $this->_arrPrivate['VARI']->getParam('CLIENTIP','server');
	}

	/**
	 * 获取Page数据（调度使用）
	 * @return array
	 */
	function getDatas(){
		return $this->_arrPrivate['PAGEDATA'];
	}

	/**
	 * 设置翻页控件数据
	 * @param array $p_arrPage
	 * @param string $p_strAction
	 * @param string $p_strColumn
	 * @param string $p_strPre
	 * @param array $p_arrParam
	 * @return array
	 */
	protected function setPage($p_arrPage,$p_strAction,$p_strColumn,$p_strPre,$p_arrParam=array()){
		$intCurrentPage=$p_arrPage['CURRENTPAGE']['INDEX'];
		foreach($p_arrPage as $strKey=>$arrPage){
			if(is_array($arrPage) and isset($arrPage['INDEX'])){
				if($intCurrentPage==$arrPage['INDEX']){
					$p_arrPage[$strKey]['LINK']=false;
				}else{
					$p_arrPage[$strKey]['LINK']=true;
				}
				$p_arrPage[$strKey]['URL']=self::getURL($p_strPre,$p_strAction,array_merge($p_arrParam,array( 
						$p_strColumn=>$p_arrPage[$strKey]['INDEX'] 
				)));
			}
		}
		$intCnt=count($p_arrPage['NUMURL']);
		for($i=0;$i<$intCnt;++$i){
			if($intCurrentPage==$p_arrPage['NUMURL'][$i]['INDEX']){
				$p_arrPage['NUMURL'][$i]['LINK']=false;
			}else{
				$p_arrPage['NUMURL'][$i]['LINK']=true;
			}
			$p_arrPage['NUMURL'][$i]['URL']=self::getURL($p_strPre,$p_strAction,array_merge($p_arrParam,array( 
					$p_strColumn=>$p_arrPage['NUMURL'][$i]['INDEX'] 
			)));
		}
		return $p_arrPage;
	}
}